package main

import (
	"flag"
	"fmt"
	"os"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

// 修改这些变量 来控制程序的运行逻辑
var (
	// 程序内置
	OssEndpoint = "oss-cn-beijing.aliyuncs.com"
	AccessKey    = "LTAI5tCZwRqpJBuJ1nDSG52c" //
	AccessSecret = "1KiQq5bIQv047FhFg1ck77KSi2gdDa"
	//默认参数
	bucketName   = "cloud-station-go7"	

    // 用户需要传递的参数
	uploadFile = "" 
	// 使用说明的参数
	help = false 
)

//参数合法性检查
func validate() error{
	if AccessKey == "" || AccessSecret == "" || OssEndpoint == "" {
		return fmt.Errorf("access or accessSecret or  OssEndpoint has one empty")
	}

	if uploadFile == "" {
		return fmt.Errorf("upload file path required")
	}
	//最后都检测通过返回nil
	return nil 
}
// 实现文件上传的函数
func Upload(filepath string) error {
	//1. 获取client实例
	client, err := oss.New(OssEndpoint, AccessKey, AccessSecret)
	if err != nil {
		panic(err)
	}
	//2. 获取bucket
	bucket, err := client.Bucket(bucketName)
	if err != nil {
		return err
	}
	//3. 上传文件
	err = bucket.PutObjectFromFile(filepath,filepath)
	if err != nil {
		return err
	}
	fmt.Printf("文件: %s上传成功\n", uploadFile)

	// 4. 打印上传链接
	downloadUrl, err := bucket.SignURL(filepath, oss.HTTPGet, 60 * 60 * 24)
	if err != nil {
		return err 
	}
	fmt.Printf("下载链接: %s\n", downloadUrl)
	fmt.Println("\n注意: 文件下载有效期为1天, 中转站保存时间为3天, 请及时下载")

	return nil 
}

// 通过CLI实现文件指定文件上传
func loadParams() {
	//将传递的值赋值给哪个变量, 名字, 值, 使用说明
	flag.BoolVar(&help, "h", false, "使用说明")
	flag.StringVar(&uploadFile, "f", "", "指定本地文件")
	flag.Parse()
	if help {
		usage()
		os.Exit(0)
	}
}

func usage() {
	// 1.打印使用说明描述信息
	fmt.Fprintf(os.Stderr, `cloud-station version: 0.0.1
Usage: cloud-station [-h] -f <uplaod_file_path>
Options:
	`)
	// 2. 打印有哪些参数可以使用
	flag.PrintDefaults()
}
func main() {
	// 读取输入
	loadParams()
	// 参数校验
	if err := validate();err != nil {
		fmt.Printf("上传参数异常: %s\n", err )
		usage()
		os.Exit(-1)
	}
	// 上传文件
	if err := Upload(uploadFile);err != nil {
		fmt.Printf("上传文件异常: %s\n", err)
	}
	
}  



// 编译文件
// go build -o cloudstaion main.go